#include "HC595.H"

bit buzzer_status = 0; // 蜂鸣器的状态

unsigned int  buzzer_time_flag ; //蜂鸣器的时间

/**
 * 函数功能：向HC595芯片发送一个字节的数据
 * 参数说明：X - 要发送的字节数据
 * 函数流程：
 *   1. 将RCLK1引脚拉低，准备接收数据
 *   2. 循环8次，每次发送1位数据
 *      - 将SCLK1引脚拉低，准备发送数据
 *      - 将数据的最高位（D7）赋值给HC595的DAT1引脚
 *      - 将SCLK1引脚拉高，完成1位数据的发送
 *      - 将X左移1位，准备发送下一位数据
 *   3. 将RCLK1引脚拉低，然后拉高，完成数据的锁存
 */
void HC595_send(unsigned char X)
{
  unsigned char i; 

  //如果fuction0x40没开启 则将X的最高位置为1 蜂鸣器强制关闭


  HC595_RCLK1 = 0;
  for(i=0;i<8;i++)
  {
    HC595_SCLK1 = 0;
    HC595_DAT1  = X & 0x80; // 1000 0000
    HC595_SCLK1 = 1;
    X <<= 1;
  }
 

 // HC595_RCLK1 = 0;
  HC595_RCLK1 = 1;


}


//同理，发送数据到第二个HC595芯片
void HC595_send2(unsigned char X)
{
  unsigned char i;
  HC595_RCLK2 = 0;

  for(i=0;i<8;i++)
  {
    HC595_SCLK2 = 0;
    HC595_DAT2  = X & 0x80; // 1000 0000
    HC595_SCLK2 = 1;
    X <<= 1;
  }

  HC595_RCLK2 = 0;
  HC595_RCLK2 = 1;

 

}

// 定义一个函数来控制蜂鸣器关闭
void buzzer_off() 
{
//  HC595_data = HC595_data | 0X80;  //关闭蜂鸣器  1000 0000            
//  HC595_send(HC595_data);  
 // HC595_data = HC595_data & ~0X80;  //关闭蜂鸣器  1000 0000            
   HC595_send((~HC595_data)|0x80);
}

/**
  * @brief  反转蜂鸣器电平
  * @param  无
  * @retval 无
  */
void buzzer()
{
  if (buzzer_status)
  {
    buzzer_status = 0;
     HC595_send(~(HC595_data|0x80) );
    //开启蜂鸣器 
  }
  else
  {
    buzzer_status = 1;
     
     HC595_send( ~ ( HC595_data & (~0x80 ) ) );
      //关闭蜂鸣器
  
  }

  
}


void buzzer_timer(void)
 {
	static unsigned char buzzer_time=0; //计数变量

	if(buzzer_time<buzzer_time_flag)  //如果计数变量小于蜂鸣器时间 则执行蜂鸣器反转
    {
			 Function|=(0x40);    //蜂鸣器反转 开启
			 buzzer_time++;
	}
    
  else
  {
      
            buzzer_time_flag=0;
        	buzzer_time=1;  //赋值为1 使if判断 在不调用蜂鸣器时候一直处于假中
			
      
			Function&=(~0x40);	  //蜂鸣器反转  关闭

            
           if(Function&0X20)
        {
            
            
            if(Music_flag==0)
            {         
              HC595_send(0xff);
            }
              else
             {
                
              HC595_send( ~(HC595_data &0x80));
                
            }
        }
	
      

	}

}

void delay(int xms)	//延时x毫秒@12.000MHz
{
	unsigned char data i, j;

	while(xms--)
	{
		i = 12;
		j = 169;
		do
		{
			while (--j);
		} while (--i);
	}
}
void Delay100us(int xus)	//@12.000MHz
{
	unsigned char data i, j;
    while(xus--)
	{
        i = 2;
        j = 39;
        do
        {
            while (--j);
        } while (--i);
    }
}
